﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Globalization;
using System.Data.SqlClient;
using DigDes.DS2012.DataLoader.Contracts;
using DigDes.DS2012.BaseLoader;
using DigDes.DS2012.DataAccess;


namespace DigDes.DS2012.DislocationLoader
{
    public class DisLoader : Loader, ILoader
    {
        /// <summary>
        /// Проверка, может ли загрузчик работать с конкретным файлом
        /// </summary>
        /// <param name="FileName">Имя файла (не требуется)</param>
        /// <param name="Data">Байтовое предствавление содержимого файла</param>
        /// <returns></returns>
        public bool CanLoadData(string FileName, byte[] Data)
        {
            using (StreamReader strReader = new StreamReader(new MemoryStream(Data), Encoding.GetEncoding(866)))
                if (strReader.ReadLine().Length != 116)
                    return false;

            return true;
        }

        /// <summary>
        /// Загрузка информации из файла в БД
        /// </summary>
        /// <param name="FileName">Имя файла (требуется имя файла)</param>
        /// <param name="Data">Байтовое представление файла</param>
        public void LoadData(string FileName, byte[] Data)
        {
            var bufString = "";

            using (StreamReader strReader = new StreamReader(new MemoryStream(Data), Encoding.GetEncoding(866)))
            {
                while (strReader.BaseStream.Length != strReader.BaseStream.Position)
                {
                    bufString = strReader.ReadLine();
                    if(bufString.Length == 116)
                        storeData(bufString, getYear(FileName));
                }
            }

            storeData();
        }

        private void storeData(string bufString, int currentYear)
        {
            var ParsedData = Parser.ParseData(bufString, currentYear);

            if (ParsedData != null)
            {
                SqlParameter[] sqlParameters = new SqlParameter[] {
                    new SqlParameter("CarNumber", ParsedData.CarNumber),
                    new SqlParameter("RollCheck", ParsedData.RollCheck),
                    new SqlParameter("Lightweight", ParsedData.Lightweight),
                    new SqlParameter("KindOfCar", ParsedData.KindOfCar),
                    new SqlParameter("TypeOfConditionalCodeOfCar", ParsedData.TypeOfConditionalCodeOfCar),
                    new SqlParameter("StartDate", ParsedData.StartDate),
                    new SqlParameter("FeatTracking", ParsedData.FeatTracking),
                    new SqlParameter("StateCode", ParsedData.StateCode),
                    new SqlParameter("ActualCargoWeight", ParsedData.ActualCargoWeight),
                    new SqlParameter("ArrivalStation", ParsedData.ArrivalStation),
                    new SqlParameter("CargoRateCode", ParsedData.CargoRateCode),
                    new SqlParameter("CargoOperativeCode", ParsedData.CargoOperativeCode),
                    new SqlParameter("RecipientCode", ParsedData.RecipientCode),
                    new SqlParameter("SpecialNotesOfCar", ParsedData.SpecialNotesOfCar),
                    new SqlParameter("NumberOfCaseCG", ParsedData.NumberOfCaseCG),
                    new SqlParameter("NumberOfCaseCP", ParsedData.NumberOfCaseCP),
                    new SqlParameter("NumberOfCaseKG", ParsedData.NumberOfCaseKG),
                    new SqlParameter("NumberOfCaseKP", ParsedData.NumberOfCaseKP),
                    new SqlParameter("ListNote", ParsedData.ListNote),                    
                    new SqlParameter("CarParkType", ParsedData.CarParkType),
                    new SqlParameter("FaultCode", ParsedData.FaultCode),
                    new SqlParameter("DepartureStation", ParsedData.DepartureStation),
                    new SqlParameter("OperationCode", ParsedData.OperationCode),
                    new SqlParameter("OperationDate", ParsedData.OperationDate),
                    new SqlParameter("StationOfOperation", ParsedData.StationOfOperation),
                    new SqlParameter("DeliveryRoad", ParsedData.DeliveryRoad),
                    new SqlParameter("ReceptRoad", ParsedData.ReceptRoad),
                    new SqlParameter("TrainIndex", ParsedData.TrainIndex),
                    new SqlParameter("TrainNumber", ParsedData.TrainNumber)};

                var storeDataCommand = new LoaderCommands("usp_DislocationLoaderTemp", sqlParameters);
                storeDataCommand.ExecCommand();
            }
        }

        private void storeData()
        {
            var storeDataCommand = new LoaderCommands("usp_DislocationLoaderFinish");

            storeDataCommand.ExecCommand();
        }
    }
}


